package com.linkgie.galaxyframework.process;

/**
 * 流程节点跳转预处理器；
 * <p>
 * 
 * 预处理器定义了流程在跳转到一个节点之前要执行的处理逻辑；<br>
 * 通过预处理器，可以在流程节点到达的时候自动地执行一些处理措施，更新上下文数据，并自动跳转或者挂起等待交互输入；<br>
 * 
 * 如果预处理器的处理过程抛出任何异常，则中断流程处理并触发流程的 Ter；
 * <p>
 * 
 * 流程要求必须定义一个默认的预处理器，每一个节点可以定义预处理器，如果未定义则采用流程统一定义的默认预处理器；
 * 
 * @author Hike
 *
 */
public interface NodeTransferedPrehandler {

	/**
	 * 处理流程节点跳转；<p>
	 * 
	 * 根据返回的跳转方式，该节点对应的流程执行模式({@link ProcessStep#getExectionMode()})有不同的值；
	 * 
	 * <p>
	 * 如果返回值为 {@link TransferMethod#AUTO_NEXT} ，则该节点的执行模式为 {@link ExecutionMode#AUTOMATIC} ;<br>
	 * 如果返回值为 {@link TransferMethod#WAIT_MANUAL} ，则该节点的执行模式为 {@link ExecutionMode#MANUAL} ;<br>
	 * 
	 * 
	 * @param processContext 流程上下文；通过{@link ProcessContext#getActivedNode()}获取执行预处理的当前节点；
	 * @return
	 */
	TransferMethod handleTransfered(ProcessContext processContext);

	/**
	 * 跳转方式；
	 * 
	 * @author Hike
	 *
	 */
	public static enum TransferMethod {

		/**
		 * 指示流程接下来自动跳转到下一节点；
		 */
		AUTO_NEXT,

		/**
		 * 指示流程接下来等待人工交互的提交（通过方法{@link ProcessFlow#commit()}触发）；
		 */
		WAIT_MANUAL

	}

}
